package org.facyt.vacas.utils;


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;



public class StringUtils {

  public static final String CRLF = "\r\n";
  
  /**
   * Completa con ceros a la IZQUIERDA del texto, hasta completar la cantidad de
   * maximoDigitos caracteres.
   * @param text
   * @param maximoDigitos
   * @return
   * 
   */
  public static String completarConCeros(String text, int maximoDigitos) {
    int numCeros = maximoDigitos - text.length();
    String ceros = "";
    for (int i = 0; i < numCeros; i++) {
      ceros += "0";
    }
    return ceros + text;
  }
  
  public static boolean validaFecha(String fecha){
	  SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
	  Date fechaintroducida = null;
	  try {
	  fechaintroducida=df.parse(fecha);
	  } catch (Exception e) {
	  	return false;
	  }

	  if (fechaintroducida == null) {
	  	return false;
	  }

	  return true;
  }
  /**
   * Completa con ceros a la IZQUIERDA del texto, hasta completar la cantidad de
   * maximoDigitos caracteres.
   * @param text
   * @param maximoDigitos
   * @return
   * 
   */
  public static String completarConCerosAtras(String text, int numCeros) {
    
    String ceros = "";
    for (int i = 0; i < numCeros; i++) {
      ceros += "0";
    }
    return text+  ceros;
  }
  
  
  
  public static String completarConEspaciosAtras(String text, int maximoDigitos) {
    int numEspacios = maximoDigitos - text.length();
    String espacios = "";
    for (int i = 0; i < numEspacios; i++) {
      espacios += " ";
    }
    return text + espacios;
  }
    
  
  public static String completarConEspaciosAdelante(String text, int maximoDigitos) {
    int numEspacios = maximoDigitos - text.length();
    String espacios = "";
    for (int i = 0; i < numEspacios; i++) {
      espacios += " ";
    }
    return espacios + text;
  }
  
  
	/**
	 * Formatea la fecha parametro para mostrar en la interfaz de usuario. 
	 */
  public static String formatearUI(Date fecha) {
		SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
		if (fecha != null)
			return sd.format(fecha);
		else
			return "";
	}
  
//  /**
//	 * Formatea la fecha parametro para mostrar en la interfaz de usuario. 
//	 */
//  public static String formatearUI2(Date fecha) {
//		SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yy");
//		if (fecha != null)
//			return sd.format(fecha);
//		else
//			return "";
//	}

	/**
	 * Formatea un String para la interfaz de usuario (si es nulo, muestra cadena vacia)
	 */
	public static String formatearUI(String texto) {
		if (texto != null)
			return texto;
		else
			return "";
	}
	
	/**
	 * Formatea un String para la interfaz de usuario:
	 * Si es un String nulo o vacio, retorna la cantidad de guiones especificados.
	 * Sino, retorna el string.
	 */
	public static String formatearUIGuiones(String texto, int guiones) {
		if (texto != null)
			return texto;
		else {
			String res = "";
			for (int i = 0; i < guiones; i++) {
				res = res + "-";
			}  
			return res;
		}
	}

	/**
	 * Formatea un String para la interfaz de usuario:
	 * Si es un String nulo o vacio, retorna la cantidad de guiones especificados.
	 * Sino, retorna el string.
	 */
	public static String formatearUIGuiones(Long nro, int guiones) {
		if (nro != null)
			return nro.toString();
		else {
			String res = "";
			for (int i = 0; i < guiones; i++) {
				res = res + "-";
			}  
			return res;
		}
	}

//	/**
//	 * Formatea un String para la interfaz de usuario:
//	 * Si es un String nulo o vacio, retorna la cantidad de guiones especificados.
//	 * Sino, retorna el string.
//	 */
//	public static String formatearUIGuiones(Date fecha, int guiones) {
//		if (fecha != null) {
//			SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy");
//			return sd.format(fecha);
//		} else {
//			String res = "";
//			for (int i = 0; i < guiones; i++) {
//				res = res + "-";
//			}  
//			return res;
//		}
//	}

	/**
	 * Formatea la fecha parametro para mostrar en la interfaz de usuario. 
	 */
	public static String formatearUI(Long nro) {
		if (nro != null)
			return nro.toString();
		else
			return "";
	}

	/**
	 * Formatea la fecha parametro para mostrar en la interfaz de usuario. 
	 */
	public static String formatearUI(Integer nro) {
		if (nro != null)
			return nro.toString();
		else
			return "";
	}

	/**
   * Formatea un String para que ocupe determinados espacios en una "tabla" (lista AWT)
   * @param elemento
   * @param espacios
   * @return
   */
  public static String formatearEnTabla(String elemento, int espacios) {
    String nuevoElemento;
    if (elemento != null)
      nuevoElemento = elemento;
    else
      nuevoElemento = "";
    if (nuevoElemento.length() <= espacios) {
      String resultado = nuevoElemento;
      for (int i = nuevoElemento.length(); i < espacios; i++) {
        resultado += " ";
      }
      return resultado;
    } else if ((nuevoElemento.length() > espacios) && (espacios > 3)) {
      return nuevoElemento.substring(0, espacios - 3) + "...";
    } else {
      return nuevoElemento.substring(0, espacios);
    }
  }

  

  
  
  /**
   * Formatea un Long para que ocupe determinados espacios en una "tabla" (lista AWT)
   * @param elemento
   * @param espacios
   * @return
   */
  public static String formatearEnTabla(Long elemento, int espacios) {
    String resultado = "" + elemento;
    int ocupados = resultado.length();
    for (int i = ocupados; i < espacios; i++) {
      resultado += " ";
    }
    return resultado;
  }

  /**
   * Metodo auxiliar que, dado un numero indicando la cantidad de decimales,
   * devuelve un string con el formato que se le debe aplicar a un Double para
   * representarlo utilizando dicha cantidad de decimales.
   * Ej: para 2 decimales: "0.00"
   * @param cantDecimales
   * @return
   */
  private static String getFormat(int cantDecimales) {
    String resultado = "0.";
    for (int i = 0; i < cantDecimales; i++) {
      resultado += "0";
    }
    return resultado.equals("0.") ? "0" : resultado;
  }
  
  
//  /**
//   * 
//   * @param elemento
//   * @param espacios
//   * @param cantDecimales
//   * @return
//   */
//  public static String formatearEnTabla(Double elemento, int espacios, int cantDecimales) {
//    DecimalFormatSymbols ds = new DecimalFormatSymbols(Locale.getDefault());
//    ds.setDecimalSeparator('.');
//    DecimalFormat df = new DecimalFormat(getFormat(cantDecimales), ds);
//    String resultado = df.format(elemento.doubleValue());    
//    int ocupados = resultado.length();
//    for (int i = ocupados; i < espacios; i++) {
//      resultado += " ";
//    }
//    return resultado;
//  }

  /**
   * Reemplaza en cadena1, la cadena "patron" con la cadena "cadena2 
   * @author rbravo
   */
  public static String reemplazar(String cadena1, String patron, String cadena2) {
	  if(cadena1.isEmpty())
		  return "0";
	  else
	  {
    // Primero se busca el indice del inicio de patron en la cadena
    int inicio = cadena1.indexOf(patron);
    // Si no existe el patron, retornar la cadena sin reemplazar.
    if (inicio < 0)
      return cadena1;
    else {
      String resultado = cadena1.substring(0, inicio);
      resultado = resultado.concat(cadena2);
      String temp = cadena1.substring(inicio + patron.length());
      if (temp.equals(""))
        resultado = resultado.concat(".");
      else
        resultado = resultado.concat(temp);
      return resultado;
    }
	  }
  }
  
  /**
   * DIVIDE EN UN ARRAY DE STRING a un String dado segun un string parametro.
   * 
   * @author rbravo
   *
   */
  public static String[] split(String cadena, String separador) {
    String nuevaCadena = cadena;
    int pasadas = 0;
    int pos = 0;
    int pos2 = 0;
    ArrayList listaPosiciones = new ArrayList();
    while (pos != -1) {
      if (pos + 2 == cadena.length())
        pos = -1;
      else {
	      if (pasadas > 0)
	        nuevaCadena = nuevaCadena.substring(pos + 1);
	      else
	        nuevaCadena = nuevaCadena.substring(pos);
	      pos2 = nuevaCadena.indexOf(separador);
	      if (pos2 != -1)
	        pos2 = pos + pos2 + pasadas;
	      pos = pos2;
	      listaPosiciones.add(new Integer(pos));
      }
      pasadas++;
    }
    String[] res = new String[pasadas]; 
    for (int i = 0; i < pasadas; i++) {
      // Si estoy en la ultima posicion
      if (i + 1 == pasadas)
        res[i] = cadena.substring(((Integer)listaPosiciones.get(i-1)).intValue() + 1);
      else if (i == 0) {
        // Se estoy en el primero.
        res[i] = cadena.substring(0, ((Integer)listaPosiciones.get(i)).intValue());
      } else
        // Si son puntos intermedios
        res[i] = cadena.substring(((Integer)listaPosiciones.get(i-1)).intValue() + 1,
            ((Integer)listaPosiciones.get(i)).intValue());
    }
    return res;
  }
  

	public static String subtraerPunto(String item){
		String itemSinPunto;
		int indicePunto = item.indexOf('.');		
		itemSinPunto = item.substring(indicePunto+1);		
		return itemSinPunto;
	}
	
	/**
	 * @param dato
	 * @return
	 */
	public static Object getDato(String dato) {
		if(dato == null)
			return new String("Sin datos");
		else return 
		    dato;
	}

	/**
	 * @param integer
	 * @return
	 */
	public static Object getDato(Integer dato) {
		if(dato == null)
			return new String("Sin datos");
		else return 
		    dato;
	}

	/**
	 * @param dato
	 * @return
	 */
	public static Object getDato(Date dato) {
		if(dato == null)
			return new String("Sin datos");
		else return 
		    dato;
	}

	/**
	 * @param dato
	 * @return
	 */
	public static Object getDato(Long dato) {
		if(dato == null)
			return new String("Sin datos");
		else return 
		    dato;
	}
	
	/**
	 * @param dato
	 * @return
	 */
	public static Object getDato(Double dato) {
		if(dato == null)
			return new String("Sin datos");
		else return 
		    dato;
	}

	
	/**
	 * @param dato
	 * @return
	 */
	public static Boolean getDato(Boolean dato) {
		if(dato == null)
			return new Boolean(false);
		else return 
		    dato;
	}
	
	public static String separarYReturnParteTrasera(String texto, String separador)
	{
		 String resultado = null;
		 int indice = texto.indexOf(separador);
		 if(indice < 0)
		 	return texto;
		 else
		 {
		 	resultado = texto.substring(indice + 1);
//		 	System.out.println(resultado);
		 }
		 	return  resultado;
	}
	
	public static String separarYReturnParteDelantera(String texto, String separador)
	{
		 String resultado = null;
		 int indice = texto.indexOf(separador);
		 if(indice < 0)
		 	return texto;
		 else
		 {
		 	resultado = texto.substring(0, indice);
//		 	System.out.println(resultado);
		 }
		 	return  resultado;
	}

	public static String quitarEspaciosAdelanteYAtras(String texto) {
		String resultado = null;
		boolean seguir = true;
		int pos = 1;
		while(seguir)
		{
			if(texto.startsWith(" "))				
				texto = texto.substring(pos);
			else
				seguir = false;
		}
		
		seguir = true;
		pos = texto.length();
		while(seguir)
		{
			if(texto.endsWith(" "))
			{
				texto = texto.substring(0, pos);
				pos--;
			}
			else
				seguir = false;
		}
		
		return  texto;
	}
	
	
	public static void main(String[] arg)
	{
		String resultado = quitarEspaciosAdelanteYAtras("  Te  xto. ");
		Float n = new Float("0.34566");
		float valor = truncNum(n.floatValue(), 3);
		
//		System.out.println(resultado);
		
	}

	/**
	 * @param string
	 * @return
	 */
	public static String getDatoRestriccion(Float dato) {
		if(dato == null)
			return new String("");
		else 
			return dato.toString();
	}

	public static Object getDato(Float dato) {
		if(dato == null)
			return new String("Sin datos");
		else return 
		    dato;
	}
	
	/**
	 * si quieres que se trunque a 1 decimal multiplicas por 10 y divides para 10
	si quieres que se trunque a 2 decimales multiplicas por 100 y divides para 100
	y asi segun el numero de decimales que necesites.
	 * @param num a truncar, multDiv=cant a dividir: 10 o 100
	 * @return
	 * @throws Exception
	 */
	public static float roundNum(float num,int multDiv) throws Exception
	{
	float valor = 0;

	valor = num;

	valor = valor*multDiv;
	valor = java.lang.Math.round(valor);
	valor = valor/multDiv;

	return valor;

	}
	
	public static float roundNum(float num) throws Exception
	{
	float valor = 0;

	valor = num;

	valor = valor*10000;
	valor = java.lang.Math.round(valor);
	valor = valor/10000;

	return valor;

	}

	/**
	 * si quieres que se trunque a 1 decimal multiplicas por 10 y divides para 10
	si quieres que se trunque a 2 decimales multiplicas por 100 y divides para 100
	y asi segun el numero de decimales que necesites.
	 * @param num a truncar, multDiv=cant a dividir: 10 o 100
	 * @return
	 * @throws Exception
	 */
	public static Double roundNum(Double num,int multDiv) throws Exception
	{
	double valor = 0;

	valor = num.doubleValue();

	valor = valor*multDiv;
	valor = java.lang.Math.round(valor);
	valor = valor/multDiv;
		try{
			return new Double(valor);
		}catch (Exception e) {
		    // TODO: handle exception
		    return new Double("0");
		}
	}



	public static float truncNum(float f, int valorDecimal) {	
		String numero = "1";
		numero = completarConCerosAtras(numero, valorDecimal+1);
		int valorDec = new Integer(numero).intValue(); 
		try {
			return roundNum(f, valorDec);
		} catch (Exception e) {
			return f;
		}
		
	}
	

	public static String getSimela(String dato)
	{
		String simela = dato;
		String aux = simela;
		String resultado = simela;
		try{			
			int posicionpunto = simela.indexOf(".");
			if(posicionpunto > 0) // hay punto
			{
				resultado = simela.substring(0, posicionpunto)+",";
				if(dato.length()>posicionpunto+4)
					resultado = resultado + aux.substring(posicionpunto+1, posicionpunto+4);
				else
					resultado = resultado + aux.substring(posicionpunto+1);
			}			
			return reemplazarSimela(resultado, 1);
		}catch (Exception e) {
			return dato;
		}
	}
	
	/**
	 * @param dato
	 * @param i: cant de veces que agrego puntos de miles
	 * @return
	 */
	private static String reemplazarSimela(String dato, int i)
	{
		String simela = dato;
		String aux = simela;
		String resultado = simela;		
		try{		
			int posicioncoma = simela.indexOf(",");
			int posicionpunto = simela.indexOf(".");
			if(posicionpunto > 0) //hay punto ya puesto.
			{
				int posicionnextpunto =posicionpunto - 3;
				if(posicionnextpunto > 0)
				{
					simela = dato.substring(0, posicionnextpunto)+".";
					simela = simela + aux.substring(posicionnextpunto);
					return reemplazarSimela(simela, i);
				}
				else
					return simela;						
			}else
			{
				int posicionnextpunto =posicioncoma - 3;
				if(posicionnextpunto > 0)
				{
					simela = dato.substring(0, posicionnextpunto)+".";
					simela = simela + aux.substring(posicionnextpunto);
					return reemplazarSimela(simela, i);
				}else
					return simela;
			}
	}catch (Exception e) {
		return dato;
	}
			
	}

	public static String getSimela2decimales(String dato)
	{
		String simela = dato;
		String aux = simela;
		String resultado = simela;
		try{			
			int posicionpunto = simela.indexOf(".");
			if(posicionpunto > 0) // hay punto
			{
				resultado = simela.substring(0, posicionpunto)+",";
				if(dato.length()>posicionpunto+3)
					resultado = resultado + aux.substring(posicionpunto+1, posicionpunto+3);
				else
					resultado = resultado + aux.substring(posicionpunto+1);
			}			
			return reemplazarSimela(resultado, 1);
		}catch (Exception e) {
			return dato;
		}
	}
	
	public static boolean isNumeric(String cadena){
		try {
			Float.parseFloat(cadena);
			return true;
		} catch (NumberFormatException nfe){
			return false;
		}
	}
	
	
}